package com.tj.basic;


import org.junit.Test;

/**
 * 关于数据类型的一些测试和使用
 */
public class DataType {
    /**
     * （1）引用类型的默认值是null，整型的默认值是0，浮点数默认值是0.0，
     * boolean默认值是false，char默认值是'\u0000'，无法显式
     * （2）不管引用类型还是基本类型，都必须是在方法外声明才有默认值，而方法内可以先声明，但使用前必须进行赋值。
     * （3）long型和float型的默认值不会加后缀，且long型的默认值和int类型默认值比较，float的默认值与double类型默认值比较都是相等的
     */
    String s1;
    int a1;
    long b1;
    float c1;
    double d1;
    char e1;
    boolean f1;
    @Test
    public void test01() {
        String s2 = null;
        System.out.println(s1);//null
        System.out.println(s2);//null
        int a2 = 0;
        System.out.println(a1);//0
        System.out.println(a2);//0

        System.out.println(b1);//0
        System.out.println(b1==a1);//true
        System.out.println(c1);//0.0
        System.out.println(d1);//0.0
        System.out.println(c1==d1);//true
        System.out.println(e1);//false
        System.out.println(f1);//'\u0000'，不可见
    }

    /**
     * （1）long型、float型和double型后分别可以加后缀大写或小写的L、F、D。
     * 其中long型是建议加后缀并建议使用大写L，float是强制加后缀，大小写均可，double是可加可不加
     * （2）float和double是不精确的，比如float型的3.14与double型的3.14不等。
     */
    @Test
    public void test02(){
        long a1 = 3l;
        long a2 = 3L;
        long a3 = 3;
        System.out.println(a1+","+a2+","+a3);//3,3,3
        System.out.println(a1==a2);//true
        System.out.println(a2==a3);//true

        //float b1 = 3.14;报错，必须加后缀
        float b2 = 3.14f;
        float b3 = 3.14F;
        System.out.println(b2+","+b3);

        double c1 = 3.14d;//与long型一样，double加后缀也不是强制性的
        double c2 = 3.14D;
        double c3 = 3.14;
        System.out.println(c1+","+c2+","+c3);//3.14,3.14

        System.out.println(b2==c2);//false
    }

    /**
     * （1）进制：Java中有十进制、八进制和十六进制，没有二进制。
     * 十进制没有后缀d。八进制是前缀数字0。十六进制是前缀数字0和字母x，字母大小写均可。
     * （2）科学计数法：以e或E进行表示，其中e前必须有数，可以为0，也可以为小数，e后必须有数，可以为正负整数，包括0.
     * 科学计数法表示的数必须进行强转才能赋值给变量。
     * （3）字符：unicode表示法、转义字符
     */
    @Test
    public void test03(){
        int a1 = 10;
        int a2 = 010;
        int a3 = 0x10;
        int a4 = 0X10;
        int a5 = 0xaF;
        System.out.println(a1+","+a2+","+a3+","+a4+","+a5);//10,8,16,16,175

        int b1 = (int) 3e2;
        float b2 = (float) 3E-2;
        System.out.println(b1+","+b2);

        char c1 = 'a';//直接赋值
        char c2 = '\u0033';//unicode码
        char c3 = '\\';//转义字符
        System.out.println(c1+","+c2+","+c3);
    }

    /**
     * （1）整型
     * byte，short，int，long：将一个左边类型的变量赋值给右边类型的变量，为自动转换，反之为强制转换
     * int类型是默认的整数类型，byte和short变量与数值运算后的类型变为int，如果再赋值byte或short，需要强转
     * long型变量与数值运算结果为long型。
     * （2）浮点数
     * float向double是自动转换，反之是强转
     * （3）boolean不参与任何转换
     * （4）char
     * char赋值给byte类型，编译器会检查字符字面量表示的数值大小，如果未超过左侧变量的表示范围，则是自动转换，反之则是强制转换
     * char类型赋值给short、int、long，都是自动转换
     * 字母整型赋值给char，编译器会检查其大小是否符合char的表示范围
     * byte、short变量赋值给char为自动转换，int和long赋值给char为强制转换
     * （5）浮点数与整数
     * 将浮点数赋值给整型都是强转,反之都是自动转换。
     * （6）溢出
     * 对于整型溢出，实际相当于构成一个循环。比最大数大一的数是最小数。
     */
    @Test
    public void test04(){
        int a1 = '0';
        int a2 = 'A';
        int a3 = 'a';
        System.out.println(a1+","+a2+","+a3);//48,65,97
        byte b1 = '\u0001';
        byte b2 = (byte) '\u4531';
        byte b3 = 'a';


        char c1 = 12;
        char c2 = (char) a1;

        float d1 = 3.14f;
        long d2 = 3;
        float d3 = d2;

    }

}
